import xml.etree.ElementTree as ET
from xml.dom import minidom  # 用于美化输出


def sort_xml_elements(input_filepath, output_filepath=None):
    """
    读取一个XML文件，根据元素的 'name' 属性对 `<color>` 元素进行排序，
    并将其写回到原文件或指定的新文件中。

    Args:
        input_filepath (str): 待排序的XML文件路径。
        output_filepath (str, optional): 排序后的文件保存路径。
                                         如果为 None，则覆盖原文件。
    """
    if output_filepath is None:
        output_filepath = input_filepath

    try:
        # 1. 解析XML文件
        tree = ET.parse(input_filepath)
        root = tree.getroot()

        # 2. 查找所有要排序的元素
        # 在 <resources> 标签下查找所有 <color> 元素
        elements_to_sort = root.findall('color')

        # 3. 排序
        # 使用元素的 'name' 属性作为排序的键 (key)
        sorted_elements = sorted(
            elements_to_sort,
            key=lambda elem: elem.get('name', '')  # .get('name', '') 是为了安全，防止某些元素没有 name 属性
        )

        # 4. 清除并重建XML树
        # 移除旧的元素
        for elem in elements_to_sort:
            root.remove(elem)

        # 添加排序后的元素
        for elem in sorted_elements:
            root.append(elem)

        # 5. 保存排序后的XML (美化输出)
        #
        # 直接使用 ET.tostring() 会导致输出的 XML 格式压缩在一行，
        # 为了美观，我们使用 minidom 来格式化输出。

        # 将 ET.ElementTree 转换成字符串
        rough_string = ET.tostring(root, 'utf-8')

        # 使用 minidom 进行格式化（pretty print）
        reparsed = minidom.parseString(rough_string)

        # 写入文件，encoding='utf-8' 是为了确保正确处理中文等非ASCII字符
        with open(output_filepath, "w", encoding="utf-8") as f:
            # get('encoding', 'utf-8') 是为了在头部加上XML声明
            f.write(reparsed.toprettyxml(indent="    ", encoding="utf-8").decode('utf-8'))

        print(f"✅ 文件排序成功！排序后的内容已保存到：{output_filepath}")

    except FileNotFoundError:
        print(f"❌ 错误：未找到文件 {input_filepath}")
    except ET.ParseError:
        print(f"❌ 错误：文件 {input_filepath} 不是有效的 XML 格式。")
    except Exception as e:
        print(f"❌ 发生未知错误: {e}")


# --- 如何使用 ---
if __name__ == "__main__":
    # 假设你的文件名为 colors.xml
    INPUT_FILE = "/Users/hanrong.zheng/Projects/oraimo-android/module_resource/src/main/res/values-night/colors.xml"

    # 运行排序函数。
    # 如果只传入一个参数，它会覆盖原文件。
    # sort_xml_elements(INPUT_FILE)

    # 也可以指定一个不同的输出文件（例如 output_colors.xml）
    sort_xml_elements(INPUT_FILE, "output_colors.xml")